package com.zzyl.framework.interceptor;

import com.zzyl.common.exception.base.BaseException;
import com.zzyl.common.utils.StringUtils;
import com.zzyl.common.utils.UserThreadLocal;
import com.zzyl.framework.web.service.TokenService;
import io.jsonwebtoken.Claims;
import org.apache.hc.core5.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户端请求拦截器
 *
 * @Author mr.zhao
 * @Date 2025/5/23 21:03
 */
@Component
public class MemberInterceptor implements HandlerInterceptor {

	@Autowired
	private TokenService tokenService;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		//如果不是Controller资源直接放行
		if (!(handler instanceof HandlerMethod)){
			return true;
		}

		//获取请求头的token
		String token = request.getHeader("authorization");

		//如果token为空响应401
		if (StringUtils.isBlank(token)){
			response.setStatus(HttpStatus.SC_UNAUTHORIZED);
			throw new BaseException("登录认证失败,401");
		}

		//解析token
		try {
			Claims claims = tokenService.parseToken(token);

			//解析成功,设置到threadlocal
			Long userId = Long.valueOf(claims.get("userid").toString());
			UserThreadLocal.set(userId);
		} catch (Exception e) {
			e.printStackTrace();
			//解析失败,响应401
			response.setStatus(HttpStatus.SC_UNAUTHORIZED);
			throw new BaseException("登录认证失败");
		}

		//放行请求
		return true;
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		UserThreadLocal.remove();
	}
}
